[2023-08-21] sumin #137#149
Conversation
There was a problem hiding this comment.
여기서 고인물 냄새가 나부렀어요 ㅋㅋㅋㅋ
풀이를 위해서 고민한 자와 풀이는 아는데 어떤걸로 할지 고민하신자가 이번 풀이에 너무 눈에 보였습니다 ㅋㅋㅋㅋ
There was a problem hiding this comment.
ㅋㅋㅋㅋㅋㅋ 고인물냄새
에라토스테네스 체 알고리즘의 시간복잡도가 O(N log log N) 이라고하는데 그럼 그냥 처음부터 끝까지 다 나누는게 더 빠른거 아닌가 생각이 드는데 이 방식이 더 빠르다고 해서요 ㅠㅠ
제가 잘못 이해한걸까요?
There was a problem hiding this comment.
해당 방법은 제가 알고있는 에라토스테네스의 체 알고리즘이 아니라 일반적인 소수 판별 알고리즘같은데, 혹시 주석을 작성하시고 풀이를 바꾼 것이 맞으실까요? 저는 이번 문제에서 에라토스테네스의 체 방식은 굳이 필요 없다고 생각했습니다!
There was a problem hiding this comment.
@limstonestone 처음부터 끝까지 다 나누는게 무슨 뜻일까요?? 정확히 질문을 이해를 못 했어요 ㅠㅠㅠ
대충 제 뇌피셜로 도현님의 질문이,
"에라토스테네스의 체는 O(N log log N) 이니까 처음부터 끝까지 다 나누는 O(N)이 더 빠른거 아님?"
라고 생각하고 답을 써보자면..!
소수 판별을 할 때, 도현님이 작성하신 어떤 수 n이 소수인지 확인하는 방법은 2~√n까지 수로 나눴을 때 나눠지는 수가 있는지 확인하는 방식으로 시간복잡도가 O(√n)이 걸리죠? 그건 말 그대로 어떤 수 n 하나에 대해 소수인지 판별하는거죠!!
근데 여기서 문제는 n만 소수인지 확인하는 건 상관없지만, 1부터 n까지 중 소수가 몇 개인지를 구하는데 시간복잡도가 얼마나 걸릴까요? O(n * √n)이 걸리겠죠? 모든 수에 대해 소수인지 판별해야 하니까!!!
그럼 n이 1,000,000이면 O(n * √n)에 대해 연산횟수는 1,000,000 * 1,000 = 1,000,000,000 = 10억번 연산이니까 당연히 시간초과가 나겠죠?
그래서 나온게 에라토스테네스의체이고, 에라토스테네스의 체는 도현님이 알고 계신것처럼 O(N log log N) 의 시간복잡도를 가져요. 그럼 n이 1,000,000이라해도 약 4,316,983 정도의 연산횟수를 갖게되니 시간초과도 안나죠! (대신 메모리는 훨씬 많이 먹음)
결론은 제가 저기 주석을 안지워서 헷갈리셨을 것 같은데..😭(이 문제는 에라토스테네스의 체를 안써도됨)
1. 어떤 수 N이 소수인지 아닌지 판별할 때: 2~√n까지의 수로 나눠보는 방법 -> O(√n)
2. 여러 개의 수가 소수인지 아닌지를 판별할 때: 에라토스테네스의 체 -> O(N log log N)
이렇게 생각하시면 될 것 같습니다!
+그래도 이해가 안되면 소수판별 방법이랑 에라토스테네스의 체 개념을 다시 공부하길..!
https://www.youtube.com/watch?v=9rLFFKmKzno
There was a problem hiding this comment.
@zsmalla 엥 그러네용 ;; 처음에 문제를 대충 읽고 해당 수까지 소수의 개수가 몇 개인지 다 구하는 건줄 알고 에라토스테네스의 체로 코드를 짰다가 지웠는데 저 부분 주석이 안지웠네요 ㅠㅠ 시간복잡도에 작성된 것처럼 O(√n)의 시간복잡도로 해결 가능하고 지수님 말씀처럼 에라토스테네스의 체는 사용하지 않아도 됩니다!!!
There was a problem hiding this comment.
역시 빈문자열을 제외할 방법이 condition문을 제외하고는 어렵네요 ㅠ
There was a problem hiding this comment.
ㅋㅋㅋㅋㅋㅋ 고인물냄새
에라토스테네스 체 알고리즘의 시간복잡도가 O(N log log N) 이라고하는데 그럼 그냥 처음부터 끝까지 다 나누는게 더 빠른거 아닌가 생각이 드는데 이 방식이 더 빠르다고 해서요 ㅠㅠ
제가 잘못 이해한걸까요?
zsmalla
left a comment
There was a problem hiding this comment.
수민님 다운 깔끔한 풀이 잘 봤습니다! 혹시 다만 이 문제의 로직이 0으로 분할 후 소수 개수를 구한다는 로직에 달한다는 과정이 주석에 설명되어있다면 혹 처음 이 문제를 보는 사람에게 설명하기에 조금 더 좋을 것 같습니다! 고생 많으셨습니다 수민님! 시간 되실 때 코멘트 답변도 부탁드립니다~
There was a problem hiding this comment.
해당 방법은 제가 알고있는 에라토스테네스의 체 알고리즘이 아니라 일반적인 소수 판별 알고리즘같은데, 혹시 주석을 작성하시고 풀이를 바꾼 것이 맞으실까요? 저는 이번 문제에서 에라토스테네스의 체 방식은 굳이 필요 없다고 생각했습니다!
@zsmalla님이 발견해주신 부분 반영해서 코드 다시 커밋해놨습니다 ~! 항상 꼼꼼한 리뷰 감사합니다 지수님!!! |

PR Summary
풀이시간: 20분
<input>
<solution>
<시간복잡도>
O(log_k*n * √n)